package fr.agileandco.tootle.client.vue.composant;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.google.gwt.cell.client.ButtonCell;
import com.google.gwt.cell.client.EditTextCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.SelectionCell;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.client.rpc.AsyncCallback;

import fr.agileandco.tootle.client.Tootle;
import fr.agileandco.tootle.client.utilitaire.Popup;
import fr.agileandco.tootle.server.modèle.Statut;
import fr.agileandco.tootle.shared.dto.TâcheDTO;

public class ListeDeTâches extends CellTable<TâcheDTO> {

	public void initialiser() {
		chargerLesTâches();
	}

	private void chargerLesTâches() {
		Tootle.service().récupérerToutesLesTâches(new AsyncCallback<List<TâcheDTO>>() {

			@Override
			public void onFailure(Throwable caught) {
				Popup.affiche(caught.getMessage());
			}

			@Override
			public void onSuccess(List<TâcheDTO> result) {
				if (result.isEmpty()) {
					ajouterUneNouvelleTâche();
				} else {
					nouvelleListeDeTâches = result;
					rafraîchir();
				}
 			}
		});
	}

	private void ajouterUneNouvelleTâche() {
		nouvelleListeDeTâches.add(new TâcheDTO());
		rafraîchir();
	}
	
	private void rafraîchir() {
		setRowCount(nouvelleListeDeTâches.size(), true);
		setRowData(0, nouvelleListeDeTâches);
	}


	public ListeDeTâches() {
		ButtonCell celluleDesOptions = new ButtonCell();
		Column<TâcheDTO, String> colonneDesOptions = new Column<TâcheDTO, String>(
				celluleDesOptions) {
			@Override
			public String getValue(TâcheDTO tâcheDTO) {
				return "Supprimer";
			}
		};

		EditTextCell celluleDeLaDescription = new EditTextCell();
		Column<TâcheDTO, String> colonneDeLaDescription = new Column<TâcheDTO, String>(
				celluleDeLaDescription) {
			@Override
			public String getValue(TâcheDTO tâcheDTO) {
				return tâcheDTO.getDescription() == null ? "" : tâcheDTO.getDescription();
			}
		};

		colonneDeLaDescription
				.setFieldUpdater(new FieldUpdater<TâcheDTO, String>() {
					@Override
					public void update(int index, TâcheDTO tâcheDTO,
							String description) {
						if (description.trim().isEmpty()) {
							if (index < nouvelleListeDeTâches.size() - 1) {
								Popup.affiche("La description ne peut pas être vide");
								description = tâcheDTO.getDescription();
							}
						} else {
							tâcheDTO.setDescription(description);
							redraw();
							if (index == nouvelleListeDeTâches.size() - 1) {
								ajouterUneNouvelleTâche();
							}
						}
					}
				});

		SelectionCell listeDesStatuts = new SelectionCell(Arrays.asList("A Faire", "En cours", "Terminée"));
		Column<TâcheDTO, String> colonneDuStatut = new Column<TâcheDTO, String>(
				listeDesStatuts) {
			@Override
			public String getValue(TâcheDTO tâcheDTO) {
				return tâcheDTO.getStatut() == null ? "A Faire" : tâcheDTO.getStatut();
			}
		};

		EditTextCell celluleDuResponsable = new EditTextCell();
		Column<TâcheDTO, String> colonneDuResponsable = new Column<TâcheDTO, String>(
				celluleDuResponsable) {
			@Override
			public String getValue(TâcheDTO tâcheDTO) {
				return tâcheDTO.getResponsable() == null ? "" : tâcheDTO.getResponsable();
			}
		};

		addColumn(colonneDesOptions);
		addColumn(colonneDeLaDescription, "Description");
		setColumnWidth(colonneDeLaDescription, 300, Unit.PX);
		addColumn(colonneDuStatut, "Statut");
		addColumn(colonneDuResponsable, "Prise en charge par");
		setWidth("100%");
	}

	private List<TâcheDTO> nouvelleListeDeTâches = new ArrayList<TâcheDTO>();

	public List<TâcheDTO> liste() {
		return nouvelleListeDeTâches;
	}
}
